package functional.methodreferences.Ctor;

/**
 * @ClassName CtorReference
 * @PackageName functional.methodReferences.Cto
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/26 上午11:31
 * @Version 1.0
 */
class Dog {
    String name;
    int age = -1; // For "unknown"

    Dog() {
        name = "stray";
    }

    Dog(String nm) {
        name = nm;
    }

    Dog(String nm, int yrs) {
        name = nm;
        age = yrs;
    }
}

interface MakeNoArgs {
    Dog make();
}

interface Make1Arg {
    Dog make(String nm);
}

interface Make2Args {
    Dog make(String nm, int age);
}

public class CtorReference {
    public static void main(String[] args) {
        /**
         * Dog 有三个构造函数，函数接口内的 make() 方法反映了构造函数参数列表（ make() 方法名称可以不同）。
         *
         * 注意我们如何对 [1]，[2] 和 [3] 中的每一个使用 Dog :: new。 这 3 个构造函数只有一个相同名称：:: new，但在每种情况下都赋值给不同的接口。编译器可以检测并知道从哪个构造函数引用。
         *
         * 编译器知道调用函数式方法（本例中为 make()）就相当于调用构造函数。
         */
        MakeNoArgs mna = Dog::new; // [1]
        Make1Arg m1a = Dog::new;   // [2]
        Make2Args m2a = Dog::new;  // [3]
        /**
         * 演示使用构造方法引用创建对象的示例
         * 通过不同的函数式接口引用Dog类的构造方法
         */

        // 使用无参构造方法创建Dog对象
        Dog dn = mna.make();
        // 使用单参构造方法创建Dog对象
        Dog d1 = m1a.make("Comet");
        // 使用双参构造方法创建Dog对象
        Dog d2 = m2a.make("Ralph", 4);

    }
}